#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef double ElemSet; /* 物品重量和价值均为实数 */
#define eps (1e-9)
typedef struct ObjNode *Objects;
struct ObjNode {
    int idx; /* 序号 */
    ElemSet w; /* 重量 */
    ElemSet v; /* 价值 */
};

int CmpUnitValue(const void *a, const void *b) {
    ElemSet va, vb;

    va = ((const struct ObjNode*)a)->v / ((const struct ObjNode*)a)->w;
    vb = ((const struct ObjNode*)b)->v / ((const struct ObjNode*)b)->w;
    return (va < vb) ? 1 : -1;
}

/* 算法15-12：连续背包问题的贪心算法 Knapsack( W, s, x, n ) */
ElemSet Knapsack(ElemSet W, Objects s, double *x, int n) {
    ElemSet f_value;
    int i;

    f_value = 0; /* 初始化优化函数f最优解的值 */
    /* 将物品s[]按单价 s[i].v/s[i].w 非递增排序 */
    qsort(s, n, sizeof(struct ObjNode), CmpUnitValue);
    for (i = 0; i < n; i++) {
        if (W > eps) {
            /* 第i件物品的原始序列号为s[i].idx */
            x[s[i].idx] = 1.0; /* 首先默认第i件物品可以被完整收入背包 */
            if (W < s[i].w) { /* 如果不能完整放下 */
                x[s[i].idx] = W / s[i].w; /* 只取s[i]的x[i]部分 */
            }
            f_value += x[s[i].idx] * s[i].v; /* 将s[i]的x[i]部分收入背包 */
            W -= x[s[i].idx] * s[i].w; /* 更新背包剩余承重量 */
        } else {
            break; /* 背包已经装满 */
        }
    }
    return f_value;
}
/* 算法15-12 结束 */

int main(void) {
    Objects s;
    double *x;
    ElemSet W;
    int n, i;

    scanf("%d %lf", &n, &W);
    s = (Objects)malloc(sizeof(struct ObjNode) * n);
    x = (double *)malloc(sizeof(double) * n);
    memset(x, 0, sizeof(double) * n);
    for (i = 0; i < n; i++) {
        scanf("%lf", &s[i].w);
    }
    for (i = 0; i < n; i++) {
        scanf("%lf", &s[i].v);
        s[i].idx = i;
    }
    printf("%.2f\n", Knapsack(W, s, x, n));
    for (i = 0; i < n; i++) {
        printf("%.2f ", x[i]);
    }
    return 0;
}